function dice4_vao_gen(gl, programInfo_cube){
	//dice4
	const VAO_dice4 = gl.createVertexArray();
	gl.bindVertexArray(VAO_dice4);
	const VBO_dice4 = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, VBO_dice4);
	{
	const length = 1.0;
	const tmp = length*0.943;

	let dice4 = [
		0, length, 0, 					0, 0, 0,		0, 0,
		tmp, -length/3, 0, 				0, 0, 0,		0, 0,
		-tmp/2, -length/3, tmp*0.866, 		0, 0, 0,		0, 0,
		
		0, length, 0, 					0, 0, 0,		0, 0,
		-tmp/2, -length/3, tmp*0.866, 		0, 0, 0,		0, 0,
		-tmp/2, -length/3, -tmp*0.866, 	0, 0, 0,		0, 0,
		
		0, length, 0, 					0, 0, 0,		0, 0,
		-tmp/2, -length/3, -tmp*0.866, 	0, 0, 0,		0, 0,
		tmp, -length/3, 0, 				0, 0, 0,		0, 0,
		
		tmp, -length/3, 0, 				0, 0, 0,		0, 0,
		-tmp/2, -length/3, -tmp*0.866, 	0, 0, 0,		0, 0,
		-tmp/2, -length/3, tmp*0.866, 		0, 0, 0,		0, 0,
	];
		
	//法向量计算
	for(let i = 0;i < 4;i += 1){
		//cal
		let v1 = [
			dice4[i * 3 * 8] - dice4[i * 3 * 8 + 8],
			dice4[i * 3 * 8 + 1] - dice4[i * 3 * 8 + 8 + 1],
			dice4[i * 3 * 8 + 2] - dice4[i * 3 * 8 + 8 + 2],
		];
		
		let v2 = [
			dice4[i * 3 * 8 + 16] - dice4[i * 3 * 8 + 8],
			dice4[i * 3 * 8 + 16 + 1] - dice4[i * 3 * 8 + 8 + 1],
			dice4[i * 3 * 8 + 16 + 2] - dice4[i * 3 * 8 + 8 + 2],
		];
		
		let norm = normal_gen(v1, v2);
		//
		for(let j = 0;j < 3;j += 1){
			dice4[i * 3 * 8 + j * 8 + 3] = norm[0];
			dice4[i * 3 * 8 + j * 8 + 4] = norm[1];
			dice4[i * 3 * 8 + j * 8 + 5] = norm[2];
		}
	}
	
		
	//纹理坐标计算
	for(let row = 0;row< 3;row += 1){
		for(let col = 0;col < 3;col += 1){
			let i = row * 3 + col;
			if(i >= 4){
				break;
			}
			dice4[i * 24 +6] = (col + 0.5) / 3.0;
			dice4[i * 24 +7] = (3.0 - row) / 3.0;
			
			dice4[i * 24 + 8 +6] = (col + 1.0) / 3.0;
			dice4[i * 24 + 8 +7] = (3.0 - row - 0.8) / 3.0;
			
			dice4[i * 24 + 16 +6] = (col) / 3.0;
			dice4[i * 24 + 16 +7] = (3.0 - row - 0.8) / 3.0;
			
			
		}
	}
	
	
	//输出到顶点缓冲
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(dice4), gl.STATIC_DRAW);
	
	}
	
	gl.vertexAttribPointer(
		programInfo_cube.attribLocations.vertexPosition,
		3,
		gl.FLOAT,
		false,
		32,
		0,
	);
	gl.vertexAttribPointer(
		programInfo_cube.attribLocations.normPosition,
		3,
		gl.FLOAT,
		false,
		32,
		12,
	);
	gl.vertexAttribPointer(
		programInfo_cube.attribLocations.coordPosition,
		2,
		gl.FLOAT,
		false,
		32,
		24,
	);
	gl.enableVertexAttribArray(programInfo_cube.attribLocations.vertexPosition);
	gl.enableVertexAttribArray(programInfo_cube.attribLocations.normPosition);
	gl.enableVertexAttribArray(programInfo_cube.attribLocations.coordPosition);
	
	
	return VAO_dice4;
	
}